package com.example.nirvana.dataStructure.algorithm;

/**
 * 双指针操作数组元素
 */
public class DoublePointerOperateArray {
    /**
     * 删除排序数组中的重复项
     *
     * @param nums 排序数组
     * @return 移除后数组的新长度
     */
    int removeDuplicates(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int slow = 0, fast = 0;
        while(fast < nums.length) {
            if (nums[slow] != nums[fast]) {
                slow++;
                // 维护 nums[0..slow] 无重复
                nums[slow] = nums[fast];
            }
            fast++;
        }
        // 数组长度为索引 + 1
        return slow + 1;
    }


    /**
     * 移除元素
     *
     * @param nums 数组
     * @param val 需要的值
     * @return
     */
    int removeElement(int[] nums, int val) {
        int slow = 0, fast = 0;
        while (fast < nums.length) {
            if (nums[slow] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }

    /**
     * 将数组中的所有值为 0 的元素移到数组末尾
     *
     * @param nums 数组
     */
    void moveZeroes(int[] nums) {
        // 去除 nums 中的所有 0
        // 返回去除 0 之后的数组长度
        int p = removeElement(nums, 0);

        // 将 p 之后的所有元素赋值为 0
        for (; p < nums.length; p++) {
            nums[p] = 0;
        }
    }
}
